package ui.newgamescreen.listeners;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;

import javax.swing.JButton;
import javax.swing.JLabel;

import ui.ScreenPanelManager;
import ui.ScreenPanelManager.ID;
import ui.newgamescreen.NewGameScreenPanel;
import engine.GameStance;

public class NextButtonListener implements ActionListener {

	private HashMap<String, String> nameFieldMap = new HashMap<String, String>() {
		{
			put("universeForm", "Форма вселенной");
			put("clusterQuantity", "Количество кластеров");
			put("starQuantity", "Количество звезд");
			put("playerName", "Имя правителя");
			put("universeSize", "Размер вселенной");
		}
	};

	private NewGameScreenPanel newGameScreenPanel;
	private HashMap<String, Object> valueMap = new HashMap<String, Object>();
	private JButton nextButton;

	private JLabel helpText;

	public NextButtonListener(NewGameScreenPanel newGameScreenPanel, JLabel helpText) {
		this.newGameScreenPanel = newGameScreenPanel;
		this.helpText = helpText;
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		this.nextButton = (JButton) e.getSource();

		getFields();

		if (checkFields()) {
			ScreenPanelManager manager = ScreenPanelManager.getInstance();
			putFieldsIntoEngine();
			manager.activateScreenByID(ID.USP);
		}
	}

	/**
	 * Метод для инициализации движка значениями из ЭФ
	 */
	private void putFieldsIntoEngine() {
		GameStance gameStance = GameStance.getInstance();
		if (valueMap.get("universeForm").equals("Случайная")) {
			gameStance.createStarmap((Integer) valueMap.get("universeSize"),
				(Integer) valueMap.get("starQuantity"), 0);
		} else if (valueMap.get("universeForm").equals("Спиральная")) {
			gameStance.createStarmap((Integer) valueMap.get("universeSize"), 0, 0);
		} else {
			gameStance.createStarmap((Integer) valueMap.get("universeSize"),
				(Integer) valueMap.get("starQuantity"), (Integer) valueMap.get("clusterQuantity"));
		}

	}

	/**
	 * Метод для получения значения из полей экранной формы
	 */
	/**
	 * 
	 */
	private void getFields() {
		try {
			valueMap.put("universeForm",
				newGameScreenPanel.universeOptionPanel.universeFormChooser.getSelectedItem());
			valueMap.put("clusterQuantity",
				newGameScreenPanel.universeOptionPanel.
				clusterQuantityChooser.getValue());
			valueMap.put("starQuantity",
				Integer.parseInt(newGameScreenPanel.universeOptionPanel.
					starQuantityField.getText()));
			valueMap.put("playerName", newGameScreenPanel.playerOptionPanel.playerName.getText());
			valueMap.put("universeSize",
				Integer.parseInt(newGameScreenPanel.universeOptionPanel.universeSizeField
					.getText()));
		} catch (NumberFormatException nfe) {
			nfe.printStackTrace();
		}

		/*
		 * valueMap.put("ethnos",
		 * newGameScreenPanel.playerOptionPanel.ethnos.getSelectedItem());
		 * valueMap.put("emblem",
		 * newGameScreenPanel.playerOptionPanel.emblem.getSelectedItem());
		 * valueMap.put("color",
		 * newGameScreenPanel.playerOptionPanel.color.getSelectedItem());
		 */

	}

	/**
	 * Метод для проверки корректности заполнения полей
	 * 
	 * @return truе, если все поля заполнены корректно
	 */
	private boolean checkFields() {
		int quant = 0;
		int size = 0;

		for (String key : valueMap.keySet()) {
			if (valueMap.get(key).equals("")) {
				fireWarning(key, false);
				return false;
			}
		}
		quant = (Integer) valueMap.get("starQuantity");
		if ((quant > 1000) || (quant < 10)) {
			fireWarning("starQuantity", true);
			return false;
		}
		size = (Integer) valueMap.get("universeSize");
		if ((size > 1000) || (size < 20)) {
			fireWarning("universeSize", true);
			return false;
		}

		return true;
	}

	/**
	 * Метод для отображения текста ошибки на экране
	 * 
	 * @param field поле в котором возникла ошибка
	 * @param mode тип ошибки: true - если некорректно заполнено поле, false -
	 *        если не заполнено поле
	 */
	private void fireWarning(String field, boolean mode) {

		if (mode) {
			helpText.setText("Некорректно заполнено поле \"" + nameFieldMap.get(field) + "\"");
		} else
		{
			helpText.setText("Необходимо заполнить поле \"" + nameFieldMap.get(field)
				+ "\" для начала игры");
		}
	}

}
